<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="UgXLJ" id="UgXLJ"><span data-lake-id="u4d9ccd68" id="u4d9ccd68">典型回答</span></h1>
  <p data-lake-id="u75ba00bd" id="u75ba00bd"><br></p>
  <p data-lake-id="u96119fc8" id="u96119fc8"><span data-lake-id="u57cf9b25" id="u57cf9b25">滑动窗口限流是一种流量控制策略，用于控制在一定时间内允许执行的操作数量或请求频率。它的工作方式类似于一个滑动时间窗口，在窗口内允许的操作数量是固定的，窗口会随着时间的推移不断滑动。</span></p>
  <p data-lake-id="u2b088718" id="u2b088718"><span data-lake-id="ud6e7c687" id="ud6e7c687">​</span><br></p>
  <p data-lake-id="ub865dd94" id="ub865dd94"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1694696535317-378396b0-5d2e-4672-8276-852719b7ad4e.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_43%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="u1a53df88" id="u1a53df88"><br></p>
  <p data-lake-id="u0bcf57b3" id="u0bcf57b3"><span data-lake-id="u470fe719" id="u470fe719">首先需要把时间划分成多个连续的时间片段，每一个片段都有一个固定的时间间隔，如1s、1h等。</span></p>
  <p data-lake-id="ue71aabc7" id="ue71aabc7"><span data-lake-id="uc72b2aa8" id="uc72b2aa8">​</span><br></p>
  <p data-lake-id="ua1dff98a" id="ua1dff98a"><span data-lake-id="u8712bc28" id="u8712bc28">然后再定义一个</span><strong><span data-lake-id="u62fe8a12" id="u62fe8a12">时间窗口</span></strong><span data-lake-id="uea4e3d13" id="uea4e3d13">，比如10s，随着时间的推移，这个窗口不断的向右移动。为了实现限流的功能，我们通常需要定义一个计数器，统计时间窗口内的请求数。</span></p>
  <p data-lake-id="u8421d4be" id="u8421d4be"><span data-lake-id="u2ab835b6" id="u2ab835b6">​</span><br></p>
  <p data-lake-id="u107babc6" id="u107babc6"><span data-lake-id="ueb3f270c" id="ueb3f270c">当时间窗口移动时，需要把上一个时间片段中的请求数减掉，当有新的请求或操作到达系统时，系统会检查窗口内的计数是否已满。如果计数未满，请求被允许执行；如果计数已满，请求被拒绝或进入等待队列，或执行其他限流操作。</span></p>
  <p data-lake-id="ud22a5216" id="ud22a5216"><span data-lake-id="ud9374d64" id="ud9374d64">​</span><br></p>
  <p data-lake-id="u1dd5d403" id="u1dd5d403"><span data-lake-id="u9e49f2f4" id="u9e49f2f4">滑动窗口限流的主要</span><strong><span data-lake-id="ua63796c6" id="ua63796c6">优点是可以在时间内平滑地控制流量</span></strong><span data-lake-id="u38719206" id="u38719206">，而不是简单地设置固定的请求数或速率。这使得系统可以更</span><strong><span data-lake-id="u3485098d" id="u3485098d">灵活地应对突发流量或峰值流量</span></strong><span data-lake-id="ua8d53ec2" id="ua8d53ec2">，而不会因为固定速率的限制而浪费资源或降低系统性能。</span></p>
  <p data-lake-id="u1dc85e6d" id="u1dc85e6d"><span data-lake-id="ucc094792" id="ucc094792">​</span><br></p>
  <p data-lake-id="u67a23500" id="u67a23500"><span data-lake-id="ue2a698fc" id="ue2a698fc">滑动窗口限流可以在分布式系统、API服务、网络通信等各种应用场景中使用，以确保系统的稳定性和可用性，防止过多的请求或操作对系统造成负担或崩溃。</span></p>
  <p data-lake-id="u812af7e8" id="u812af7e8"><span data-lake-id="u93ed7620" id="u93ed7620">​</span><br></p>
  <h1 data-lake-id="EsaR5" id="EsaR5"><span data-lake-id="u18c4a9f0" id="u18c4a9f0">扩展知识</span></h1>
  <p data-lake-id="ub4793c58" id="ub4793c58"><br></p>
  <h2 data-lake-id="S94qN" id="S94qN"><span data-lake-id="u056de3f2" id="u056de3f2">固定窗口限流</span></h2>
  <p data-lake-id="u2207d1d2" id="u2207d1d2"><br></p>
  <p data-lake-id="ud70a3cc2" id="ud70a3cc2"><span data-lake-id="ub886c95b" id="ub886c95b">固定窗口限流中，也是需要定义时间片段和时间窗口，只不过在计数上有一个区别，那就是当随着时间的推移，到了下一个时间窗口时，固定窗口限流的计数器的数量会被清零。重新开始计数。</span></p>
  <p data-lake-id="ud3c26913" id="ud3c26913"><span data-lake-id="u22f768af" id="u22f768af">​</span><br></p>
  <p data-lake-id="u882691c8" id="u882691c8"><span data-lake-id="udd65c101" id="udd65c101">固定窗口限流的主要特点是窗口大小是固定的，不管请求是否均匀分布，每个窗口内的请求数量都是相同的。这可能导致某些时间段内请求过多，而在其他时间段内则很少，不同窗口之间可能出现流量的不平衡。</span></p>
  <p data-lake-id="u6a0dbca8" id="u6a0dbca8"><span data-lake-id="u5f842c71" id="u5f842c71">​</span><br></p>
  <h2 data-lake-id="dYFFc" id="dYFFc"><span data-lake-id="u67c660b3" id="u67c660b3">实现滑动窗口</span></h2>
  <p data-lake-id="u9bee8932" id="u9bee8932"><br></p>
  <p data-lake-id="u33d8fc58" id="u33d8fc58"><span data-lake-id="ub68b6ce9" id="ub68b6ce9">​</span><br></p>
  <p data-lake-id="u2f9d705f" id="u2f9d705f"><span data-lake-id="u318f261a" id="u318f261a">​</span><br></p>
  <p data-lake-id="u3ceb0465" id="u3ceb0465"><br></p>
  <p data-lake-id="uf9011d74" id="uf9011d74"><br></p>
 </body>
</html>